Subroutine to calculate the distance between the units inside a kohonen layer
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
real(kind=wp), | intent(inout), | dimension(:,:) | :: | coordinates |
Real array with the coordinates |
|
real(kind=wp), | intent(inout), | dimension(:,:) | :: | distance_matrix |
Real array with the distance_matrix |
|
character(len=*) | :: | grid_type |
Character variable with the grid type |
|||
logical | :: | toroidal |
Logical variable for toroidal grid |
Type | Visibility | Attributes | Name | Initial | |||
---|---|---|---|---|---|---|---|
integer, | public | :: | i | ||||
integer, | public | :: | j | ||||
real(kind=wp), | public | :: | maxdiffx | ||||
real(kind=wp), | public | :: | maxdiffy | ||||
real(kind=wp), | public | :: | maxdiffz | ||||
real(kind=wp), | public, | dimension(3) | :: | diffs |
subroutine calculate_distance_matrix(coordinates,distance_matrix,grid_type,toroidal) !======================================================================================== !! Subroutine to calculate the distance between the units inside a kohonen layer real(kind=wp),dimension(:,:),intent(inout) :: coordinates !! Real array with the coordinates real(kind=wp),dimension(:,:),intent(inout) :: distance_matrix !! Real array with the distance_matrix character(len=*) :: grid_type !! Character variable with the grid type logical :: toroidal !! Logical variable for toroidal grid integer :: i,j real(kind=wp) :: maxdiffx,maxdiffy,maxdiffz real(kind=wp),dimension(3) :: diffs ! maxdiffx=maxval(coordinates(:,1))/2.0_wp; maxdiffy=maxval(coordinates(:,2))/2.0_wp; maxdiffz=maxval(coordinates(:,3))/2.0_wp; ! distance_matrix=0.0d0; ! if(toroidal) then do i=1,size(distance_matrix,1); do j=i+1,size(distance_matrix,2); diffs=dabs(coordinates(j,1:3) - coordinates(i,1:3)); if (diffs(1) > maxdiffx) diffs(1)=2.0_wp*maxdiffx - diffs(1); if (diffs(2) > maxdiffy) diffs(2)=2.0_wp*maxdiffy - diffs(2); !if (diffs(3) > maxdiffy) diffs(3)=2*maxdiffz - diffs(3); if (trim(grid_type) == 'hexagonal') then distance_matrix(i,j)=sum(diffs**2); elseif(trim(grid_type) == 'rectangular') then!rectangular distance_matrix(i,j)=maxval(diffs); endif !write(*,*) 'd= ',i,j,diffs(1:3),trim(grid_type)!distance_matrix(i,j) enddo enddo else do i=1,size(distance_matrix,1); do j=i+1,size(distance_matrix,2); diffs=dabs(coordinates(j,1:3) - coordinates(i,1:3)); distance_matrix(i,j)=dsqrt(sum(diffs**2)); enddo enddo endif ! distance_matrix=distance_matrix + transpose(distance_matrix); ! end subroutine calculate_distance_matrix